#ifndef USERDEF_H_
#define USERDEF_H_

#include "../SAMA_Function.h"

/*自定义模块广播参数结构体-特例，其他模块不需要该结构体*/
typedef struct {
	unsigned char DInum;
	unsigned char AInum;
	bool DIdata[20];
	float AIdata[20];
	char filename[32];						////< ShiKe20201021 根据要求 python自定义模块需要再传入一个文件名称作为参数	
}USERDEF_BCPar_t;


/*模块可调参数结构体*/
typedef struct {
	unsigned char DigitalPara_Num;			//< 数字量参数数量
	unsigned char AnalogPara_Num;			//< 模拟量参数数量
	bool* DigitalPara_Pt;					//< 数字量参数数组指针
	float* AnalogPara_Pt;					//< 模拟量参数数组指针
	char filename[32];						////< ShiKe20201021 根据要求 python自定义模块需要再传入一个文件名称作为参数	
}USERDEF_Par_t;

/*模块运算中间参数结构体定义*/
typedef struct {
	unsigned char DigitalSta_Num;			//< 数字量中间参数数量
	unsigned char AnalogSta_Num;			//< 模拟量中间参数数量
	bool* DigitalSta_Pt;					//< 数字量中间参数数组指针
	float* AnalogSta_Pt;					//< 模拟量中间参数数组指针
}USERDEF_Sta_t;

/*模块参数结构体定义*/
struct USERDEF_T
{
	Model_Base_t Base;						//< 模块基本参数结构体
	USERDEF_Par_t Par;						//< 模块可调参数结构体
	USERDEF_Sta_t Sta;						//< 模块运算中间参数结构体
};

extern USERDEF_T* USERDEF_t;
extern BAK_Attend_Para_t USERDEF_Attend_Para;
extern USERDEF_BCPar_t BCPar_t;

/*函数*/
bool CALCU_SAMA(USERDEF)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);	//< SAMA运算函数
int BC_PARA(USERDEF)(Model_Base_t* arg, void** Data);												//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int CHANGE_PAR(USERDEF)(Model_Base_t* arg, void** Data);											//< 在线修改模块参数函数
int BAK_STA(USERDEF)(Model_Base_t* arg, void** Data);												//< 备份SAMA运算中间参数
int ANA_STA(USERDEF)(Model_Base_t* arg, void** Data);												//< 解析备份的SAMA运算中间参数
void INIT_STAPAR(USERDEF)(Model_Base_t* arg);														//< 初始化模块运算中间参数

#endif
